﻿// 全局变量
var m_commentPageSize = 5; // 每页评论行数
var m_userinfos = undefined;	// 用户信息，格式："userid|username|roles"

// comm.js
//function verify($) {
	//给对象加验证
	var message = "请正确填写有关信息";

	$.fn.valTrim = function () {
		return $.trim($(this).val());
	}

	$.fn.verifyEmpty = function (pram) {
		if ($(this).valTrim().length == 0)
			throwError(this, pram);
	}

	$.fn.verifyLength = function (min, max) {
		var n = $(this).valTrim().length;
		if (n < min)
			throwError(this, "最少填写" + min + "个字符");
		else if (n > max)
			throwError(this, "最多填写" + max + "个字符");
	}

	//整数
	$.fn.verifyInt = function (pram) {
		var reg = /^-?\d+$/;
		if (!reg.test($(this).valTrim()))
			throwError(this, pram);
	}

	$.fn.verifyFloat = function () {
		var reg = /^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$/;
		if (!reg.test($(this).valTrim()))
			throwError(this);
	}

	$.fn.verifyPassword = function (min, max, $id2) {
		$(this).verifyUsername(min, max);

		if ($(this).valTrim() != $id2.valTrim())
			throwError(this, "两次密码不一至");
	}

	$.fn.verifyDate = function () {
		$(this).verifyEmpty();

		//DD/MM/YYYY
		//var reg = /^(((0[1-9]|[12][0-9]|3[01])\/((0[13578]|1[02]))|((0[1-9]|[12][0-9]|30)\/(0[469]|11))|(0[1-9]|[1][0-9]|2[0-8])\/(02))\/([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3}))|(29\/02\/(([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00)))$/;
		//YYYY-MM-DD
		var reg = /^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$/;
		if (!reg.test($(this).valTrim()))
			throwError(this, "日期格式不正确 (YYYY-MM-DD)");
	}

	$.fn.verifyEmail = function () {
		$(this).verifyEmpty();

		var stremail = $(this).valTrim()
		if (stremail.length > 100)
			throwError(this, "邮箱太长");

		var reg = /^(([0-9a-zA-Z]+)|([0-9a-zA-Z]+[_.0-9a-zA-Z-]*[0-9a-zA-Z]+))@([a-zA-Z0-9-]+[.])+([a-zA-Z]{2}|net|NET|com|COM|gov|GOV|mil|MIL|org|ORG|edu|EDU|int|INT)$/;
		if (!reg.test(stremail))
			throwError(this, "邮箱格式不正确");
	}

	$.fn.verifyUsername = function (min, max) {
		$(this).verifyLength(min, max);

		var str = $(this).valTrim();
		var reg = /^[\w|\u4e00-\u9fa5]+$/;
		if (!reg.test(str))
			throwError(this, "用户名和密码只能是汉字，字母，数字和下划线");
	}

	$.fn.verifyChecked = function () {
		if (!$(this).attr("checked"))
			throwError(this);
	}

	function throwError(obj, msg) {
		obj.focus();
		throw (new Error(msg ? msg : message));
	}

//}


// 页码控件， 输入参数data，JSON数据：
// ctrlid jquery对象字符串，如"#pager"
// page 整数，当前页，从0开始
// pages 页数
// pagenu 可选，显示页码的数量，最小5，默认显示15个页码。
function HPages(data) {
	//if (!data['ctrlid'] || !data['page'] || !data['pages']) {	// data['page'] 为0时直接返回
	//	return;
	//}

	var total = data['pages'];
	if (total <= 0)
		return;

	var current = data['page'];
	//	不验证，由上级程序保证
	//if (current < 0)
	//	current = 1;
	//else if (current > total)
	//	current = total;

	//current--; //以下从0开始
	var $o = $(data['ctrlid']);
	var num = data['pagenu'] ? data['pagenu'] : 11;

	var htmstr = "";
	if (total <= num) {	// 页数很少，全部显示
		for (var i = 0; i < total;) {
			if (i === current)
				htmstr += "<a class='current'>" + ++i + "</a> ";
			else
				htmstr += "<a>" + ++i + "</a> ";
		}
	}
	else if (current < num / 2) {	// 当前页在前部，前面不显示翻页
		for (i = 0; i < num - 1;) {
			if (i === current)
				htmstr += "<a class='current'>" + ++i + "</a> ";
			else
				htmstr += "<a>" + ++i + "</a> ";
		}
		htmstr += "<a>&gt;&gt;</a> <a>" + total + "</a>";
	}
	else if (total - current - 1 < num / 2) {	// 当前页在尾部部，后面不显示翻页
		htmstr += "<a>" + 1 + "</a> <a>&lt;&lt;</a> ";
		for (i = total - num + 1; i < total;) {
			if (i === current)
				htmstr += "<a class='current'>" + ++i + "</a> ";
			else
				htmstr += "<a>" + ++i + "</a> ";
		}
	}
	else {	// 前后显示翻页
		htmstr += "<a>" + 1 + "</a> <a>&lt;&lt;</a> ";
		for (i = current - parseInt(num / 2) + 1, j = 0; j < num - 2; j++) {
			if (i === current)
				htmstr += "<a class='current'>" + ++i + "</a> ";
			else
				htmstr += "<a>" + ++i + "</a> ";
		}
		htmstr += "<a>&gt;&gt;</a> <a>" + total + "</a>";
	}

	htmstr += " &nbsp;第<input id='pageedit' type='text'/>页 <a id='pagego'>GO</a>"

	$o.html(htmstr);

	// 点击页码
	$o.children("a").click(function () {
		var pa = $(this).text();
		if (pa === 'GO') {	// 跳转到指定页
			pa = $o.children("#pageedit").val() - 1;
			if (!pa) {
				alert("请输入页码");
				return;
			}
		}
		else if (pa === '<<') {	// 上翻一段
			pa = current - num + 2;
		}
		else if (pa === '>>') {	// 下翻一段
			pa = current + num - 2;
		}
		else
			pa--;

		if (pa < 0)
			pa = 0;
		else if (pa >= total)
			pa = total - 1;

		if (data['gopage'])
			data['gopage'](pa);	// 执行翻页 gopage: function (pa) {	// 跳转到指定页面的方法
	});
}

// 取地址栏参数
function getURLparameter(name) {
	var reg = new RegExp("(^|\\?|&)" + name + "=([^&|#]*)(\\s|&|$|#)", "i");
	if (reg.test(window.location))
		return unescape(RegExp.$2);
	return "";
}
// end comm.js


// Cookie 插件
mycookie = function (name, value, options) {
	if (typeof value != 'undefined') { // name and value given, set cookie
		options = options || {};
		if (value === null) {
			value = '';
			options.expires = -1;
		}
		var expires = '';
		if (options.expires && (typeof options.expires === 'number' || options.expires.toUTCString)) {
			var date;
			if (typeof options.expires === 'number') {
				date = new Date();
				date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
			} else {
				date = options.expires;
			}
			expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE
		}
		// CAUTION: Needed to parenthesize options.path and options.domain
		// in the following expressions, otherwise they evaluate to undefined
		// in the packed version for some reason...
		var path = options.path ? '; path=' + (options.path) : '';
		var domain = options.domain ? '; domain=' + (options.domain) : '';
		var secure = options.secure ? '; secure' : '';
		document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
	} else { // only name given, get cookie
		var cookieValue = null;
		if (document.cookie && document.cookie != '') {
			var cookies = document.cookie.split(';');
			for (var i = 0; i < cookies.length; i++) {
				var cookie = jQuery.trim(cookies[i]);
				// Does this cookie string begin with the name we want?
				if (cookie.substring(0, name.length + 1) === (name + '=')) {
					cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
					break;
				}
			}
		}
		return cookieValue;
	}
};

// 页面加载完成后初始化通用内容，并调用AJAX 获取动态数据。
var titlelink;
//function loadComments() {	// 编译时去掉注释
$(function () {	//详细出处参考http://www.jb51.net/article/27444.htm

    // 注销
    $("#idlogout").click(function () {
        //??this.disabled = true; // 防止重复提交

        try {
            var prompts = {
                logout: true,
                titlelink: titlelink
            };
            $.post('/Ajax.aspx', prompts, function (data) {
                if (data === "OK") {
                    setInlogin();
                    //window.top.location.reload();
                }
                else
                    alert(data);
                //this.disabled = false;
            });

        }
        catch (err) {
            alert(err.message);
            //this.disabled = false;
        }
    });

    // 登录
    $("#rightLoginBtn").click(function () {
        //??this.disabled = true; // 防止重复提交

        login($("#inpusername").valTrim(), $("#inppassword").valTrim(), true)
    });

    // 注册
    $("#idregister").click(function () {
        //??this.disabled = true; // 防止重复提交

        try {
            $("#iddlgusername").verifyUsername(2, 50);
            $("#iddlgemail").verifyEmail();
            $("#iddlgpassword1").verifyPassword(2, 50, $("#iddlgpassword2"));

            var prompts = {
                register: $("#iddlgusername").valTrim(),
                email: $("#iddlgemail").valTrim(),
                titlelink: titlelink,
                password: $("#iddlgpassword1").valTrim()	// 原始文件这儿多一个逗号，IE6通不过。
            };
            $.post('/Ajax.aspx', prompts, function (data) {
                if (isUserinfo(data)) {
                    window.location = "/m";
                }
                else
                    alert(data);

                //??this.disabled = false;
            });

        }
        catch (err) {
            alert(err.message);
            //??this.disabled = false;
        }
    });


	// 与数据库页面相连的标题
	titlelink = $("#titlelink").attr("content");

	var prompts = {}; // 初始化Ajax.aspx的哈希表参数。

	//==== 移动版用标题关联
	prompts["titlelink"] = titlelink;

	//==== 初始化登录状态界面
	//setLoginStatus();// 不用客户端另外保存用户信息 20140104
	if ($("#userloading").length != 0) {		// 登录信息
		prompts["getuserinfo"] = true; // 取登录信息
	}

	//==== 初始化评论界面
	if ($("#commentlist").length != 0) {
		initComments();
		prompts["getcomments"] = 0; 	// 取评论，0 指定第一页
		prompts["pagesize"] = m_commentPageSize; // 取评论页数，m_commentPageSize 每页行数取页数。
		prompts["clickarticle"] = true; // 第一次取评论，记录文档点击次数。
	}

	// 页面加截完成后调用AJAX 获取动态数据。
	$.getJSON("/Ajax.aspx?" + Date(), prompts, // 地址加一个日期参数，强制更新。
		function (data) {
			if (data === null)
				return;

			if (data["comments"] !== undefined) // 有评论数据
				fillComments(data);

			if (isUserinfo(data["userinfo"]))	// 用户信息
				setLogined();
			else
				setInlogin();
		}
	);

	// 百度统计
	//$.getScript("http://hm.baidu.com/h.js?34aae54d3a411fceb05b44df2f80ee8c");	// jq1.4.2版以后不能用这句

	var z = document.getElementsByTagName("head")[0] || document.documentElement,
	C = document.createElement("script");
	C.src = "http://hm.baidu.com/h.js?34aae54d3a411fceb05b44df2f80ee8c"; // 不包含https://
	z.insertBefore(C, z.firstChild);
	//alert(Date());
});

/*// 从png文件中读代码和数据
function onp(ii) {

	// 发布编译时删除这一行
	return;

	// 从png中取js和数据
	var w = ii.width;
	var h = ii.height;

	// 从最后一行开始向上取js
	if (w < 2) {
		alert("w < 2");	// 宽度至少要两个像素，保存数据头，数据长度和hashcode
		return;
	}

	//http://www.dewen.org/q/2182
	// Create an empty canvas element
	//var canvas = document.createElement("canvas");
	//canvas.width = w;
	//canvas.height = h;

	var canvas = document.getElementById("testcanvas");

	// Copy the image contents to the canvas
	var ctx = canvas.getContext("2d");

	ctx.drawImage(ii, 0, 0);
	var imgdata = ctx.getImageData(0, 0, w, h);

	var j = h - 1;
	var da = imgdata.data;	// 从最下面一行开始取数据
	var i = w * j * 4;
	var len = da[i + 2] + da[i + 1] * 0x100 + da[i] * 0x10000;	// 取长度，前三个字节是长度。与原始数据顺序相反
	var lenhash = da[i + 6] + da[i + 5] * 0x100 + da[i + 4] * 0x10000;	// 长度hashcode，前三个字节是长度。与原始数据顺序相反
	if (((len * 31) & 0x00ffffff) !== lenhash) {
		alert("Hashcode Error " + len);
		return;
	}

	//var k = w * 301 * 4;
	//alert(da[k + 3] + " " + da[k + 2] + " " + da[k + 1] + " " + da[k + 0]);
	//alert(len);

	i = 3;	// 文件头3个像素
	var m = 0;
	var k = 0;
	var str = "";
	var hashcode = 0;

	// utf8码http://www.cnblogs.com/chenwenbiao/archive/2011/08/11/2134503.html
	// utf8-->unicode值;然后通过fromCharCode拼串http://blog.chinaunix.net/uid-52437-id-3325514.html
	var u1 = 0x7f;	// 把第一个字节前面的多余的1去掉
	var u2 = 0;	// 记录总字节数，就是第一个字节前面有多少1
	var du;
	for (; j >= 0 && m < len; j--) {
		for (; i < w && m < len; i++) {
			for (var k = 2; k >= 0 && m < len; k--, m++) {
				d = da[(j * w + i) * 4 + k];
				hashcode = ((hashcode * 31 + d) & 0xffffffff);	// hashcode算法http://zhhphappy.iteye.com/blog/1124283

				if (u2 === 0) {	// 英文字符或utf8码的第一个字节
					du = d;
					u2 = d;
				}
				else {
					du = (du << 6) + (d & 0x3f);	// utf编码除第一个字节外都是10xxxxxx形式，后六位有效。
					u1 = (u1 << 5) | 0x7f;			// 每多一个字节，总位数减一位，所以只向左移5位
				}

				if ((u2 & 0xc0) === 0xc0)	// 高两位是11表示多字节
					u2 <<= 1;
				else {					// 否则是单字节或多字节结束
					str += String.fromCharCode(du & u1);	// fromCharCode 只接受unicode码
					u1 = 0x7f;
					u2 = 0;
				}
			}
		}
		i = 0;
	}

	// 校验hashcode
	var i = w * (h - 1) * 4 + 8;	// 第三个像素是数据的hashcode
	var hash = da[i + 2] + da[i + 1] * 0x100 + da[i] * 0x10000;	// 变成整数，前三个字节是数据。与原始数据顺序相反
	if (hash !== (hashcode & 0xffffff)) {
		alert("Hashcode Error.");
		return;
	}
	eval(str);	// 执行代码

	verify(jQuery);	// 加载验证插件
	loadComments();	// ajax 加载评论
}

// 填充参考文档
function fillAssociate(data) {
	var str = "";
	$.each(data, function (key, val) {
		str += "<a href='" + key + ".htm' title='" + val + "'>" + val + "</a>";
	});
	$("#ajax_associate").html(str);
}*/

// 填充评论
function fillComments(data) {
	$("#commentaddbtn").attr("disabled", false);

	//详细出处参考：http://www.jb51.net/article/19342.htm

	var arr = data["comments"];
	var n = arr.length / 5;
	var str = "";
	// 格式化评论，每条评论有五个数据，日期作者等。
	var i = 0;
	for (; i < n; i++) {
		str += "<div class='commentauthor'>" + arr[5 * i + 0] + " &nbsp;&nbsp;" + arr[5 * i + 1] + " &nbsp;&nbsp;" + arr[5 * i + 2] + " &nbsp;&nbsp;" + arr[5 * i + 3] + "</div>" +
			"<div class='commentcontent'>" + arr[5 * i + 4] + "</div>"
	}
	// 没有评论时补2行空行
	for (; i < 2; i++)	//补一些空行
		str += "<div class='commentauthor'>&nbsp;</div><div class='commentcontent'>&nbsp;</div>";
	$("#commentlist").html(str);
	$("#popularity").html(data["commentcount"] + "/" + data["clickcount"]);

	HPages(
	{
		ctrlid: "#commentpages",
		page: parseInt(data["commentpage"]),
		pages: parseInt(data["commentpages"]),
		pagenu: 13, // 底部显示13个页号
		gopage: function (pa) {	// 跳转到指定页面的方法
			var prompts = {
				getcomments: pa, // 取评论，page: 指定页
				pagesize: m_commentPageSize,	// 取评论页数，m_commentPageSize 每页行数取页数。
				titlelink: titlelink	// 不能有逗号
			};
			$.getJSON("/Ajax.aspx?" + Date(), prompts, // 地址加一个日期参数，强制更新。
				function (data) {
					fillComments(data);
				}
			);
		}
	});

}

// 初始化评论界面
function initComments() {
	// 加载表情
	var titles = new Array(
		"微笑", "撇嘴", "色", "发呆", "害羞", "流泪", "得意", "闭嘴",
		"调皮", "发怒", "尴尬", "大哭", "睡", "呲牙", "惊讶", "难过",
		"酷", "冷汗", "抓狂", "吐", "偷笑", "可爱", "白眼", "傲慢",
		"饥饿", "困", "流汗", "憨笑", "疑问", "嘘", "折磨", "再见",
		"擦汗", "鼓掌", "糗大了", "坏笑", "委屈", "快哭了", "可怜", "亲亲",
		"鄙视", "咖啡", "强", "弱", "握手", "胜利", "抱拳", "ok"
	);

	var str = "";
	for (var i = 1; i <= titles.length; i++) {
		var nstr = i < 10 ? "0" + i : i;
		//str += "<img onclick=\"insertbq('{{em" + nstr + "}}')\" src='/images/bq/em" + nstr + ".gif' title='" + titles[i - 1] + "' />";
		str += "<img id='" + nstr + "' src='/images/bq/em" + nstr + ".gif' title='" + titles[i - 1] + "' />";
	}
	$("#commentbq").html(str); // ?? 有没有高效的方法，一次载入。

	//当前光标位置或选择区添加表情
	$("#commentbq img").click(function () {
		var $o = $("#commenttext");
		var obj = $o[0];

		// 最多两个表情
		var regex1 = /\{\{em[0-9]{2}\}\}/gi;
		var arrMatches = obj.value.match(regex1);
		if (arrMatches && arrMatches.length >= 2) {
			alert("输入表情太多。");
			return;
		}

		var bq = "{{em" + $(this).attr('id') + "}}";

		// 插入表情
		$o.focus();
		if (obj.value.length === 0)	//没有字符
			obj.value = bq;
		else if (obj.selectionStart) {	//FF, Chrome
			var start = obj.selectionStart;
			obj.value = obj.value.substr(0, obj.selectionStart) + bq + obj.value.substr(obj.selectionEnd);
			obj.selectionStart = obj.selectionEnd = start + bq.length;
		} else if (document.selection && document.selection.createRange) {	//IE
			var sel = document.selection.createRange();
			sel.text = bq;
			sel.select();
		} else {	//其它
			obj.value += txt;
		}
	});

	$("#commentaddbtn").click(function () {
		var othis = this;
		this.disabled = true; //?? 防止重复提交，不能防止页面刷新
		try {
			$("#commenttext").verifyLength(1, 500);
			var prompts = {
				pagesize: m_commentPageSize, // 取评论页数，m_commentPageSize 每页行数取页数。
				getcomments: 0, // 添加评论后，获取评论并显示第一页评论
				titlelink: titlelink,	// 从关联页取文章ID
				addcomment: $("#commenttext").valTrim()
			};
			$.getJSON("/Ajax.aspx?" + Date(), prompts, // 地址加一个日期参数，强制更新。
				function (data) {
					fillComments(data);
					window.location = "#comments"; // 添加评论完成后，滚动到评论头部
					$("#commenttext").val(""); 	// 清空评论内容
					othis.disabled = false;
				}
			);
		}
		catch (err) {
			alert(err.message);
			othis.disabled = false;
		}
	});
}

// 登录
function login(username, password, autologin) {
	//btnlogin.disabled = true; //?? 防止重复提交

	try {
		var prompts = {
			login: username,
			password: password,
			autologin: autologin,
			titlelink: titlelink
		};
		$.post('/Ajax.aspx', prompts, function (data) {
			if (isUserinfo(data)) {

				setLogined();

				$("#inpusername").val("");
				$("#inppassword").val("");
				//$("#idautologin").attr("checked", false);
			}
			else {
				alert(data);
			}

			//??btnlogin.disabled = false;
		});
	}
	catch (err) {
		alert(err.message);
		//this.disabled = false;
	}
}

// 传入的字符串是不是用户信息
function isUserinfo(str) {
	// 匹配 0630b16d-7ace-446c-9ffc-3c84cc3598ea|admin|A1
	var b = /^\w{8}-\w{4}-\w{4}-\w{4}-\w{12}\|.+\|/.test(str);
	if (b)
		m_userinfos = str.split("|");

	return b;
}

// 已经登录，显示用户名和注销
function setLogined() {
	$("#userlogined").show();
	$(".userinlogin").hide();	// 有两处class=userinlogin
	$("#userloading").hide();


	if (m_userinfos[2].length === 0)
		m_userinfos[2] = "D";

	$("#idusername").html(m_userinfos[1] + " " + m_userinfos[2]);
}

// 未登录，显示登录界面
function setInlogin() {
	$("#userlogined").hide();
	$(".userinlogin").show();	// 有两处class=userinlogin
	$("#userloading").hide();

	m_userinfos = undefined;
}
